GtkWindow: Make set_focus work before show
authorMatthias Clasen <mclasen@redhat.com>
Sat, 2 Aug 2014 09:28:03 +0000 (11:28 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 2 Aug 2014 09:38:23 +0000 (11:38 +0200)
So far, gtk_window_set_focus just did not work when called on
a hidden window. Change it to record the desired focus widget
for hidden windows, and apply it when the window gets shown.

This is similar to how we tread other window properties that
can't be set before the window is realized, like maximized
or fullscreen.

This is related to
https://bugzilla.gnome.org/show_bug.cgi?id=734033

gtk/gtkwindow.c

index b89d6ead28ca59c0b20acfb95a2fb92111ff676a..cb46ad474f3ed3f4bcaa28972ed2d200d7e28459 100644 (file)
@@ -132,6 +132,7 @@ struct _GtkWindowPrivate
 
   GtkWidget             *attach_widget;
   GtkWidget             *default_widget;
+  GtkWidget             *initial_focus;
   GtkWidget             *focus_widget;
   GtkWindow             *transient_parent;
   GtkWindowGeometryInfo *geometry_info;
@@ -2261,7 +2262,12 @@ gtk_window_set_focus (GtkWindow *window,
     }
 
   if (focus)
-    gtk_widget_grab_focus (focus);
+    {
+      if (!gtk_widget_get_visible (GTK_WIDGET (window)))
+        priv->initial_focus = focus;
+      else
+        gtk_widget_grab_focus (focus);
+    }
   else
     {
       /* Clear the existing focus chain, so that when we focus into
@@ -2291,6 +2297,7 @@ _gtk_window_internal_set_focus (GtkWindow *window,
 
   priv = window->priv;
 
+  priv->initial_focus = NULL;
   if ((priv->focus_widget != focus) ||
       (focus && !gtk_widget_has_focus (focus)))
     g_signal_emit (window, window_signals[SET_FOCUS], 0, focus);
@@ -2662,9 +2669,16 @@ gtk_window_activate_focus (GtkWindow *window)
 GtkWidget *
 gtk_window_get_focus (GtkWindow *window)
 {
+  GtkWindowPrivate *priv;
+
   g_return_val_if_fail (GTK_IS_WINDOW (window), NULL);
 
-  return window->priv->focus_widget;
+  priv = window->priv;
+
+  if (priv->initial_focus)
+    return priv->initial_focus;
+  else
+    return priv->focus_widget;
 }
 
 /**
@@ -5669,7 +5683,12 @@ gtk_window_show (GtkWidget *widget)
   is_plug = FALSE;
 #endif
   if (!priv->focus_widget && !is_plug)
-    gtk_window_move_focus (widget, GTK_DIR_TAB_FORWARD);
+    {
+      if (priv->initial_focus)
+        gtk_window_set_focus (window, priv->initial_focus);
+      else
+        gtk_window_move_focus (widget, GTK_DIR_TAB_FORWARD);
+    }
   
   if (priv->modal)
     gtk_grab_add (widget);